home *** CD-ROM | disk | FTP | other *** search
/ Amiga Games: Greatest Hits 1996 / Amiga Games: Greatest Hits 1996.iso / archive / userbox / publicdomain / frexxed.lha / frexxed / fpl / Snake.FPL < prev    next >
Text File  |  1995-08-30  |  4KB  |  153 lines

  1. /***********************************************************
  2.  *
  3.  *  Snake
  4.  *
  5.  *  Play snake.  Control with cursor keys.
  6.  *
  7.  *********/
  8. void addhighscore(string name, int score)
  9. {
  10.   int id=New();
  11.   int oldid=GetEntryID();
  12.  
  13.   if (score<0)
  14.     score=0;
  15.  
  16.   if (id) {
  17.     CurrentBuffer(id);
  18.     System("makedir FrexxEd:FPL/highscore", "", "NIL:");
  19.     Load("FrexxEd:FPL/highscore/Snake.score");
  20.     GotoLine(-1);
  21.     Output(sprintf("%8d - %s\n", score, name));
  22.     BlockSort(id,0,2);
  23.     while (ReadInfo("lines")>11) {
  24.       GotoLine(11);
  25.       DeleteLine();
  26.     }
  27.     Save();
  28.     Request(sprintf("Your score: %d\n\n HIGHSCORES:\n%s",score,GetBlock(id)), "SNAKE HIGHSCORE", "Doobie!");
  29.     Clean("Kill();");
  30.     CurrentBuffer(oldid);
  31.   }
  32. }
  33.  
  34. {
  35.   int view_lines=ReadInfo("view_lines");
  36.   int view_columns=ReadInfo("view_columns");
  37.   string text[view_lines+1];
  38.   int col[4096], line[4096];
  39.   int length=10, count, game=1, delay=0, points=0;
  40.   int posy=view_lines/2, posx=view_columns/2, poscount=0;
  41.   int yspeed=0, xspeed=1;
  42.   int change;
  43.   string key;
  44.   int blipx, blipy;
  45.   int increase=(view_lines+view_columns)/10+1;
  46.   int cheat=0;
  47.   string name;
  48.  
  49.   CursorActive(0);
  50.  
  51.   for (count=view_columns-1; count>=0; count--) {
  52.     text[1]+="*";
  53.     text[2]+=" ";
  54.   }
  55.   text[view_lines]=text[1];
  56.   text[2][0]='*';
  57.   text[2][view_columns-1]='*';
  58.  
  59.   for (count=view_lines-1; count>1; count--)
  60.     text[count]=text[2];
  61.  
  62.   text[view_lines/3][view_columns/2]='+';
  63.  
  64.   for (count=view_lines; count>0; count--)
  65.     PrintLine(text[count], count);
  66.  
  67.   name=PromptString(name, "SNAKE", "Enter name:");
  68.   if (!strlen(name))
  69.     name="Unknown";
  70.  
  71.   length=PromptInt("Length", 10, "Start length of your snake");
  72.   if (length<0) {
  73.     cheat=1;
  74.     length=abs(length);
  75.   }
  76.   length++;
  77.   points=length/5;
  78.   Status(0, joinstr("Points: ", ltostr(points)));
  79.   PrintLine("* Press a key to begin...", view_lines/2);
  80.   GetKey(0);
  81.  
  82.   while (game) {
  83.     key=GetKey(1);
  84.     if (strlen(key)) {
  85.       if (key[0]==0x9b) {
  86.         switch (key[1]) {
  87.         case 'A':
  88.           yspeed=-1;
  89.           xspeed=0;
  90.           break;
  91.         case 'B':
  92.           yspeed=1;
  93.           xspeed=0;
  94.           break;
  95.         case 'D':
  96.           yspeed=0;
  97.           xspeed=-1;
  98.           break;
  99.         case 'C':
  100.           yspeed=0;
  101.           xspeed=1;
  102.           break;
  103.         }
  104.       } else {
  105.         length+=increase;
  106.         increase++;
  107.         points+=10;
  108.         Status(0, joinstr("Points: ", ltostr(points)));
  109.       }
  110.     }
  111.     change=line[(poscount-length)&4095];
  112.     if (change>0)
  113.       text[line[(poscount-length)&4095]][col[(poscount-length)&4095]]=' ';
  114.     line[(poscount-length)&4095]=0;
  115.     posy+=yspeed;
  116.     posx+=xspeed;
  117.     switch (text[posy][posx]) {
  118.     default:
  119.       if (cheat && text[posy][posx]=='o') {
  120.         points-=110;
  121.       }
  122.       if (!cheat || points<0 || text[posy][posx]!='o') {
  123.         game=0;
  124.         break;
  125.       }
  126.     case '+':
  127.       points+=10;
  128.       Status(0, joinstr("Points: ", ltostr(points)));
  129.       length+=increase;
  130.       increase++;
  131.       do {
  132.         blipx=abs((Random()%(view_columns-2)))+1;
  133.         blipy=abs((Random()%(view_lines-2)))+1;
  134.       } while (text[blipy][blipx]!=' ');
  135.       text[blipy][blipx]='+';
  136.       PrintLine(text[blipy], blipy);
  137.     case ' ':
  138.       text[posy][posx]='o';
  139.       col[poscount]=posx;
  140.       line[poscount]=posy;
  141.       PrintLine(text[posy], posy);
  142.       if (change>0)
  143.         PrintLine(text[change], change);
  144.       poscount=(poscount+1)&4095;
  145.       break;
  146.     }
  147.   }
  148.   addhighscore(name, points);
  149.   RedrawScreen(0);
  150. }
  151.  
  152.  
  153.